// 引入 axios
import axios from 'axios'
// 引入 store
import store from '@/store'
// 单独引用elementUI 中的组件
import { Message } from 'element-ui'
// 引入路由
import router from '@/router'
// 引入 qs 将传入的对象数据转换成 urlencoded 形式
import qs from 'qs'

// 判断是后台接口还是前台接口
function getBaseURL (url) {
  if (url.startsWith('/font')) {
    return 'http://edufront.lagou.com'
  } else {
    return 'http://eduboss.lagou.com'
  }
}
// axios.create() 可以使用自定义创建一个axios实例
const request = axios.create({
  // timeout: 2000
  // baseURL
})

// 设置请求拦截器，拼接前台接口和后台接口的baseURL
request.interceptors.request.use(function (config) {
  config.baseURL = getBaseURL(config.url)
  // 设置统一的token信息
  const { user } = store.state
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})

// 封装跳转登录的函数
function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      // 当前路由的路径
      redirect: router.currentRoute.fullPath
    }
  })
}

// 存储是否正在更新 token 状态
let isRefreshing = false
// 存储等待 token 刷新挂起的请求
let requests = []

// 设置响应拦截器
request.interceptors.response.use(function (response) {
  // 状态码为2xx时，执行这里的代码
  console.log('响应成功')
  return response
}, function (error) {
  // 对响应错误做点什么
  if (error.response) {
    // 请求已发出，但服务器响应的状态码不在 2xx 范围内
    const { status } = error.response
    let errorMessage = ''
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // errorMessage = 'Token 过期 或不存在'
      // 1.token 不存在
      if (!store.state.user) {
        // 跳转登录页
        redirectLogin()
        return Promise.reject(error)
      }
      // 检测是否已经存在了正在刷新的 token 的请求
      if (isRefreshing) {
        // 存储发送失败的请求
        return requests.push(() => {
          request(error.config)
        })
      }
      isRefreshing = true
      // 2.token 过期或者错误
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // - 刷新 token 失败
        if (res.data.state !== 1) {
          // 清除无效的 token
          store.commit('setUser', null)
          // 跳转登录页
          redirectLogin()
          return Promise.reject(error)
        }
        // 刷新成功
        // - 将刷新后的 token 更新指 access_token
        store.commit('setUser', res.data.content)
        // - 重新发送失败的请求
        requests.forEach(callback => callback())
        // 发送完毕，清除 requests 内容
        requests = []
        // - 将本次请求发送
        return request(error.config)
      }).catch(err => {
        console.log(err)
      }).finally(() => {
        // 请求发送完毕，响应完毕后，最终将刷新状态设置为 false
        isRefreshing = false
      })
    } else if (status === 403) {
      errorMessage = '没有权限，请联系管理员'
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status >= 500) {
      errorMessage = '服务端错误，请联系管理员'
    }
    Message.error(errorMessage)
  } else if (error.request) {
    Message.error('请求超时，请重新请求')
  } else {
    // 意料之外的错误
    Message.error(error.message)
  }
  // 将本次请求的错误对象继续向后抛出，让接收响应处理函数进行操作
  return Promise.reject(error)
})

export default request
